﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;

namespace Cloak.Reflection
{
	/// <summary>
	/// Declares static and instance members used in reflection tests
	/// </summary>
	public sealed class Target
	{
		#region Static

		public static int StaticField = 0;

		public static int StaticProperty { get; set; }

		public static void StaticAction0Args()
		{

		}

		public static void StaticAction1Arg(int a)
		{

		}

		public static void StaticAction2Args(int a, int b)
		{

		}

		public static void StaticAction3Args(int a, int b, int c)
		{

		}

		public static void StaticAction4Args(int a, int b, int c, int d)
		{

		}

		public static int StaticFunc0Args()
		{
			return 0;
		}

		public static int StaticFunc1Arg(int a)
		{
			return a;
		}

		public static int StaticFunc2Args(int a, int b)
		{
			return a + b;
		}

		public static int StaticFunc3Args(int a, int b, int c)
		{
			return a + b + c;
		}

		public static int StaticFunc4Args(int a, int b, int c, int d)
		{
			return a + b + c + d;
		}
		#endregion

		#region Constructors
		
		public Target()
		{}

		public Target(int a)
		{
			this.Field = a;
			this.Property = a;
		}

		public Target(int a, int b)
		{
			this.Field = a;
			this.Property = a + b;
		}

		public Target(int a, int b, int c)
		{
			this.Field = a;
			this.Property = a + b + c;
		}

		public Target(int a, int b, int c, int d)
		{
			this.Field = a;
			this.Property = a + b + c + d;
		}
		#endregion

		#region Instance

		public int Field;

		public int Property { get; private set; }

		public void Action0Args()
		{

		}

		public void Action1Arg(int a)
		{

		}

		public void Action2Args(int a, int b)
		{

		}

		public void Action3Args(int a, int b, int c)
		{

		}

		public void Action4Args(int a, int b, int c, int d)
		{

		}

		public int Func0Args()
		{
			return 0;
		}

		public int Func1Arg(int a)
		{
			return a;
		}

		public int Func2Args(int a, int b)
		{
			return a + b;
		}

		public int Func3Args(int a, int b, int c)
		{
			return a + b + c;
		}

		public int Func4Args(int a, int b, int c, int d)
		{
			return a + b + c + d;
		}
		#endregion

		#region Generic

		public static void GenericAction<T>()
		{

		}

		public static void GenericAction<T1, T2>()
		{

		}

		public static void GenericAction<T1, T2, T3>()
		{

		}

		public static void GenericAction<T1, T2, T3, T4>()
		{

		}

		public static int GenericFunc<T>()
		{
			return 0;
		}

		public static int GenericFunc<T1, T2>()
		{
			return 0;
		}

		public static int GenericFunc<T1, T2, T3>()
		{
			return 0;
		}

		public static int GenericFunc<T1, T2, T3, T4>()
		{
			return 0;
		}
		#endregion
	}
}